#include "hal_adapter.h"
#include "bsp_debug.h"
#include "global.h"

#include "bsp_uart.h"



/**
 * @brief 调试串口GPIO初始化
 */
void bsp_debug_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* Peripheral clock enable */
    debug_gpioclk_enable();
    /**USART1 GPIO Configuration
    PA5     ------> USART3_RX
    PA7     ------> USART3_TX
    */
    GPIO_InitStruct.Pin = DEBUG_UART_TX_PIN | DEBUG_UART_RX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = DEBUG_UART_PORT_AF;
    HAL_GPIO_Init(DEBUG_UART_PORT, &GPIO_InitStruct);

    debug_uartclk_enable();

    /* Initialize all configured peripherals */
    bsp_uart_init(debug_uart_id);
}


/**
 * @brief  打开 INT 中断
 * @note   固定使用"上升沿"触发中断.
 * @param  isr: [I], 中断服务程序, 请将该ISR注册到 INT1 中断服务程序中;
 *         ptr: [I], 中断服务程序 isr 使用的 ptr.
 * @retval none
 */
void bsp_debug_int_enable(void (*isr)(void *ptr), void *ptr)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
	/* GPIO Ports Clock Enable */
	debug_gpioclk_enable();

	/*Configure GPIO pin : debug_rx_Pin */
	GPIO_InitStruct.Pin = DEBUG_UART_RX_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(DEBUG_UART_PORT, &GPIO_InitStruct);

	/* EXTI interrupt init*/
	HAL_NVIC_SetPriority(EXTI7_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(EXTI7_IRQn);
}

/**
 * @brief  关闭 INT 中断
 */
void bsp_debug_int_disable(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* USER CODE BEGIN MX_GPIO_Init_1 */
	/* USER CODE END MX_GPIO_Init_1 */

	/* GPIO Ports Clock Enable */
	debug_gpioclk_enable();

	/*Configure GPIO pin : comm_int_Pin */
	GPIO_InitStruct.Pin = DEBUG_UART_RX_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(DEBUG_UART_PORT, &GPIO_InitStruct);

	/* EXTI interrupt init*/
	HAL_NVIC_SetPriority(EXTI7_IRQn, 0, 0);
	HAL_NVIC_DisableIRQ(EXTI7_IRQn);
}


/**
 * @brief usart 串口休眠
 * @return * uint32_t
 */
uint32_t bsp_debug_uart_sleep(void)
{
    /* 禁用UART功能 */
    HAL_UART_DeInit(&debug_uart_ctx);

//    /* 设置RX中断(与Modem RI 管脚中断号冲突，但可用) */
//    bsp_debug_int_enable(NULL, NULL);

    /* 返回单次睡眠时长(30min) */
    return 30*60*1000;
}

/**
 * @brief bsp_debug 串口唤醒
 * @return * void
 */
void bsp_debug_uart_wakeup(void)
{
//    /* 禁用RX中断(与Modem RI 管脚中断号冲突，但可用) */
//    bsp_debug_int_disable();

    /* 重新初始话端口 */
    bsp_debug_init();
}